﻿// 4222. 罐子.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <set>
#include <queue>
#include <string>
#include <vector>
#include <algorithm>


using namespace std;
/*
https://www.acwing.com/problem/content/4225/

给你两个罐子，容积分别为 A升和 B升。

现在，你可以进行如下三种操作：

FILL(i)，将罐子 i（1≤i≤2）灌满水。
DROP(i)，将罐子 i（1≤i≤2）清空。
POUR(i,j)，将罐子 i中的水倒向罐子 j
，直到罐子 i空了或罐子 j满了为止。
请问，至少多少次操作后，可以使得其中一个罐子里恰好有 C升水。

输入格式
共一行，三个整数 A,B,C。

输出格式
如果无解，则输出一行 impossible 即可。

否则，第一行输出一个整数，表示最少操作次数。

随后按顺序每行输出一个操作指令，格式参考题面。

数据范围
1≤A,B,C≤100,
C≤max(A,B)。

输入样例：
3 5 4
输出样例：
6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)
*/

int A, B, target;
int a, b;
set<int> vis;
queue<vector<int> > q;

struct NODE {
	string op; int parentId;
};

vector<NODE> ans;

bool fill(int op, int a, int b ,int step,int parentId) {
	bool ret = false;
	if (op == 1) {a = A;}
	else {b = B;}

	if (vis.count(a * 1000 + b) == 0) {
		ret = true;
		vis.insert(a * 1000 + b);
		string str = "FILL(" + to_string(op) + ")";
		ans.push_back({ str,parentId });
		q.push({ a, b, step + 1 ,(int)ans.size()-1});
	}

	return ret;
}


bool drop(int op, int a, int b,int step,int parentId) {
	bool ret = false;
	if (1 == op) {	a = 0;}
	else {b = 0;}

	if (vis.count(a * 1000 + b) == 0) {
		vis.insert(a * 1000 + b);
		ret = true;
		string str = "DROP(" + to_string(op) + ")";
		ans.push_back({ str,parentId });
		q.push({ a, b, step + 1 ,(int)ans.size() - 1 });
	}

	return ret;
}

bool pour(int source,int target, int a, int b, int step,int parentId) {
	bool ret = false;
	if (1 == source) {
		int minop = min(a, B - b);
		b += minop; a -= minop;
	}
	else {
		int minop = min(b,  A - a);
		a += minop; b -= minop;
	}

	if (vis.count(a * 1000 + b) == 0) {
		ret = true;
		vis.insert(a * 1000 + b);
		string str = "POUR(" + to_string(source) + ","+ to_string(target)+")";
		ans.push_back({ str,parentId });
		q.push({ a, b, step + 1 ,(int)ans.size() - 1 });
	}

	return ret;
}

void printAns(int x) {
	int idx = ans[x].parentId;
	if(idx !=0)
		printAns(idx);
	cout << ans[x].op << endl;

	return;
}


int main()
{
	cin >> A >> B >> target;
	a = 0; b = 0;
	ans.push_back({ "\n",0 });
	vector<int> v; v.push_back(a); v.push_back(b); v.push_back(0); v.push_back(ans.size()-1);
	vis.insert(a * 1000 + b);
	q.push(v); 

	while (!q.empty()) {
		a = q.front()[0]; 
		b = q.front()[1];  
		int step = q.front()[2];
		int opid = q.front()[3];
		q.pop();

		if (a == target || b == target) {
			cout << step << endl; 
			printAns(opid);
			return 0;
		}

		fill(1, a, b, step, opid);
		fill(2, a, b, step, opid);

		drop(1, a, b, step, opid);
		drop(2, a, b, step, opid);

		pour(1, 2, a, b, step, opid);
		pour(2, 1, a, b, step, opid);
	}
	cout << "impossible" << endl;

	return 0 ;
}

 